home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / kernel / stwini.c.D < prev    next >
Text File  |  1990-07-31  |  9KB  |  334 lines

  1. *** /tmp/,RCSt1022356    Wed Jul 25 13:56:21 1990
  2. --- stwini.c    Mon Jul 23 22:46:35 1990
  3. ***************
  4. *** 1,2 ****
  5. ! #ifdef ATARI_ST
  6.   /*
  7. --- 1,2 ----
  8. ! #if (MACHINE == ATARI)
  9.   /*
  10. ***************
  11. *** 4,5 ****
  12. --- 4,8 ----
  13.    * on the Atari ST.
  14. +  * If yor drive is an old Supra drive you perhaps want to compile 
  15. +  * using -DSUPRA. The code added with #ifdef SUPRA/#endif is taken 
  16. +  * from usenet and not verified (since I do not have such a drive)
  17.    *
  18. ***************
  19. *** 14,15 ****
  20. --- 17,24 ----
  21.    * | DISK_WRITE | device  | proc nr |  bytes  |  offset | buf ptr |
  22. +  * |--------------------------------------------------------------|
  23. +  * |SCATTERED_IO| device  | proc nr | requests|         | iov ptr |
  24. + #ifdef CLOCKS
  25. +  * |------------+---------+---------+---------+---------+---------|
  26. +  * | DISK_IOCTL | device  | proc nr |func code| address |         |
  27. + #endif 
  28.    * ----------------------------------------------------------------
  29. ***************
  30. *** 45,53 ****
  31.   
  32. ! #include "../h/const.h"
  33. ! #include "../h/type.h"
  34. ! #include "../h/callnr.h"
  35. ! #include "../h/com.h"
  36. ! #include "../h/error.h"
  37. ! #include "const.h"
  38. ! #include "type.h"
  39.   #include "proc.h"
  40. --- 54,58 ----
  41.   
  42. ! #include "kernel.h"
  43. ! #include <minix/callnr.h>
  44. ! #include <minix/com.h>
  45.   #include "proc.h"
  46. ***************
  47. *** 62,63 ****
  48. --- 67,74 ----
  49.   
  50. + #ifdef CLOCKS
  51. + #ifndef DISK_IOCTL
  52. + # define DISK_IOCTL TTY_IOCTL
  53. + #endif
  54. + #endif /* CLOCKS */
  55.   /* Parameters for the disk drive. */
  56. ***************
  57. *** 64,66 ****
  58.   #define SECTOR_SIZE    512    /* physical sector size in bytes */
  59. - #define NR_DRIVES    1    /* maximum number of drives */
  60.   #define    MAX_MINOR    (NR_DRIVES<<3)
  61. --- 75,76 ----
  62. ***************
  63. *** 79,81 ****
  64.   
  65. ! FORWARD int hdcint();
  66.   
  67. --- 89,96 ----
  68.   
  69. ! static int do_rdwt();
  70. ! static int do_xfer();
  71. ! static void cmdhead();
  72. ! static int cmdtail();
  73. ! static int poll();
  74. ! static void hdcint();
  75.   
  76. ***************
  77. *** 84,86 ****
  78.    *===========================================================================*/
  79. ! PUBLIC winchester_task()
  80.   {
  81. --- 99,101 ----
  82.    *===========================================================================*/
  83. ! PUBLIC void winchester_task()
  84.   {
  85. ***************
  86. *** 94,96 ****
  87.       /* read sector 0 of the drive and copy the partition info */
  88. !     pi[minor].pi_size = 1;
  89.       dmagrab(WINCHESTER, hdcint);
  90. --- 109,111 ----
  91.       /* read sector 0 of the drive and copy the partition info */
  92. !     pi[minor].pi_size = 2;
  93.       dmagrab(WINCHESTER, hdcint);
  94. ***************
  95. *** 107,109 ****
  96.       }
  97. !     pi[minor].pi_size = hi.hd_size;
  98.     }
  99. --- 122,127 ----
  100.       }
  101. !     /* the next minor number is for the whole device */
  102. !     /* don't overwrite partition table; start at sector 1 */
  103. !     pi[minor].pi_start = 1;
  104. !     pi[minor].pi_size = hi.hd_size - SECTOR_SIZE;
  105.     }
  106. ***************
  107. *** 134,135 ****
  108. --- 152,157 ----
  109.           case DISK_WRITE:    r = do_rdwt(&mess);    break;
  110. +         case SCATTERED_IO:    r = do_vrdwt(&mess, do_rdwt); break;
  111. + #ifdef CLOCKS
  112. +         case DISK_IOCTL:    r = do_ioctl(&mess);    break;
  113. + #endif /* CLOCKS */
  114.           default:        r = EINVAL;        break;
  115. ***************
  116. *** 154,158 ****
  117.     register        r, errors, count, rw, drive, minor;
  118. !   register long        secnum;
  119.     register phys_bytes    address;
  120. -   extern phys_bytes    umap();
  121.   
  122. --- 176,179 ----
  123.     register        r, errors, count, rw, drive, minor;
  124. !   register long        secnum, avail;
  125.     register phys_bytes    address;
  126.   
  127. ***************
  128. *** 178,183 ****
  129.       minor, rw == DISK_READ ? "read" : "write", secnum, count));
  130. !   if (pi[minor].pi_size - secnum < count)
  131. !     count = pi[minor].pi_size - secnum;
  132.     if (count <= 0)
  133. !     return(EOF);
  134.     secnum += pi[minor].pi_start;
  135. --- 199,207 ----
  136.       minor, rw == DISK_READ ? "read" : "write", secnum, count));
  137. !   avail = pi[minor].pi_size - secnum;
  138. !   if (avail <= 0)
  139. !     return(0);
  140. !   if (avail < count)
  141. !     count = avail;
  142.     if (count <= 0)
  143. !     return(0);
  144.     secnum += pi[minor].pi_start;
  145. ***************
  146. *** 201,202 ****
  147. --- 225,231 ----
  148.    *===========================================================================*/
  149. + #ifdef SUPRA
  150. + #define PNK_DELAY    50     /* tunable */
  151. + #endif
  152.   PRIVATE int do_xfer(drive, address, sector, count, rw)
  153. ***************
  154. *** 233,240 ****
  155.     r = cmdtail(drive, sector, count);    /* command parameters */
  156.     IENABLE();
  157.     if (r == OK) {
  158.       dmacomm(wrbit | FDC | SCREG, count, HDC_DELAY);
  159. !     dmawdat(wrbit | FDC | HDC | A0, 0, HDC_DELAY);
  160. !     DMA->dma_mode = wrbit;        /* needed? */
  161.       receive(HARDWARE, &mess);    /* Wait for interrupt. */
  162.       s = dmardat(wrbit | FDC | HDC | A0, HDC_DELAY);
  163. --- 262,277 ----
  164.     r = cmdtail(drive, sector, count);    /* command parameters */
  165. + #ifndef SUPRA
  166.     IENABLE();
  167. + #endif
  168.     if (r == OK) {
  169. + #ifdef SUPRA
  170. +     IENABLE();
  171. + #endif
  172.       dmacomm(wrbit | FDC | SCREG, count, HDC_DELAY);
  173. !     DMA->dma_mode = wrbit | FDC | HDC | A0;
  174. !     dmawcmd(0, wrbit);
  175.       receive(HARDWARE, &mess);    /* Wait for interrupt. */
  176. + #ifdef SUPRA
  177. +     IDISABLE();
  178. + #endif
  179.       s = dmardat(wrbit | FDC | HDC | A0, HDC_DELAY);
  180. ***************
  181. *** 241,242 ****
  182. --- 278,282 ----
  183.       if (s & HDC_CC) {
  184. + #ifdef SUPRA
  185. +       if ((s & HDC_CC) != 2) /* 2: invalid cyl/no drive */
  186. + #endif
  187.           printf("hd: %s: drive=%d sector=%D status=0x%x\n",
  188. ***************
  189. *** 248,249 ****
  190. --- 288,293 ----
  191.       ;
  192. + #ifdef SUPRA
  193. +     for (s = 0; s< PNK_DELAY; s++) {} /* Guarantee interrupt is gone */
  194. +     IENABLE();              /* re-enable normal interrupts */
  195. + #endif
  196.     return(r);
  197. ***************
  198. *** 255,257 ****
  199.   
  200. ! PRIVATE cmdhead(drive, cmd)
  201.   {
  202. --- 299,303 ----
  203.   
  204. ! PRIVATE void cmdhead(drive, cmd)
  205. ! int drive;
  206. ! int cmd;
  207.   {
  208. ***************
  209. *** 258,261 ****
  210.     DMA->dma_mode = FDC | HDC;
  211. !   DMA->dma_data = (short)(((drive>>1)<<5) | (cmd&0x1F));
  212. !   DMA->dma_mode = FDC | HDC | A0;
  213.   }
  214. --- 304,306 ----
  215.     DMA->dma_mode = FDC | HDC;
  216. !   dmawcmd((short)(((drive>>1)<<5) | (cmd&0x1F)), FDC | HDC | A0);
  217.   }
  218. ***************
  219. *** 262,265 ****
  220.   
  221. ! PRIVATE cmdtail(drive, sector, count)
  222.   long sector;
  223.   {
  224. --- 307,312 ----
  225.   
  226. ! PRIVATE int cmdtail(drive, sector, count)
  227. ! int drive;
  228.   long sector;
  229. + int count;
  230.   {
  231. ***************
  232. *** 269,272 ****
  233.       return(ERROR);
  234. !   DMA->dma_data = (short) (((drive&1)<<5) | (((int)(sector>>16))&0x1F));
  235. !   DMA->dma_mode = FDC | HDC | A0;
  236.     if (poll() != OK)
  237. --- 316,318 ----
  238.       return(ERROR);
  239. !   dmawcmd((short) (((drive&1)<<5) | (((int)(sector>>16))&0x1F)), FDC | HDC | A0);
  240.     if (poll() != OK)
  241. ***************
  242. *** 273,276 ****
  243.       return(ERROR);
  244. !   DMA->dma_data = (short) ((int)sector >> 8);
  245. !   DMA->dma_mode = FDC | HDC | A0;
  246.     if (poll() != OK)
  247. --- 319,321 ----
  248.       return(ERROR);
  249. !   dmawcmd((short) ((int)sector >> 8), FDC | HDC | A0);
  250.     if (poll() != OK)
  251. ***************
  252. *** 277,280 ****
  253.       return(ERROR);
  254. !   DMA->dma_data = (short) sector;
  255. !   DMA->dma_mode = FDC | HDC | A0;
  256.     if (poll() != OK)
  257. --- 322,324 ----
  258.       return(ERROR);
  259. !   dmawcmd((short) sector, FDC | HDC | A0);
  260.     if (poll() != OK)
  261. ***************
  262. *** 281,284 ****
  263.       return(ERROR);
  264. !   DMA->dma_data = (short) count;
  265. !   DMA->dma_mode = FDC | HDC | A0;
  266.     if (poll() != OK)
  267. --- 325,327 ----
  268.       return(ERROR);
  269. !   dmawcmd((short) count, FDC | HDC | A0);
  270.     if (poll() != OK)
  271. ***************
  272. *** 291,293 ****
  273.    *===========================================================================*/
  274. ! PRIVATE poll()
  275.   {
  276. --- 334,336 ----
  277.    *===========================================================================*/
  278. ! PRIVATE int poll()
  279.   {
  280. ***************
  281. *** 306,314 ****
  282.   
  283. ! PRIVATE hdcint()
  284.   {
  285. !   PRIVATE message intmess;
  286.   
  287. !   intmess.m_type = DISKINT;
  288. !   interrupt(WINCHESTER, &intmess);
  289.   }
  290. ! #endif ATARI_ST
  291. --- 349,387 ----
  292.   
  293. ! PRIVATE void hdcint()
  294.   {
  295. !   interrupt(WINCHESTER);
  296. ! }
  297.   
  298. ! #ifdef CLOCKS
  299. ! #include <sgtty.h>
  300. ! #define XFERSIZE 13
  301. ! /*===========================================================================*
  302. !  *                do_ioctl                     *
  303. !  *===========================================================================*/
  304. ! PRIVATE int do_ioctl(mp)
  305. ! register message *mp;
  306. ! {
  307. !   register phys_bytes    address;
  308. !   register struct proc    *rp;
  309. !   int r;
  310. !     
  311. !   rp = proc_addr(mp->PROC_NR);
  312. !   address = umap(rp, D, (vir_bytes) mp->POSITION, (vir_bytes) XFERSIZE);
  313. !   switch(mp->TTY_REQUEST) {
  314. !      case DC_RBMS100:
  315. !      case DC_RBM